home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 June: Reference Library / Dev.CD Jun 96 RL / Dev.CD Jun 96 RL.toast / Technical Documentation / develop / develop Issue 24 / develop Issue 24 code / Scriptable Database 1.0a15 / Foundation / AbstractIterator.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-02-19  |  4.9 KB  |  141 lines  |  [TEXT/CWIE]

  1.  
  2.  
  3.  
  4. #ifndef __ABSTRACTITERATOR__
  5. #define __ABSTRACTITERATOR__
  6.  
  7. //
  8. // MoreAEM is needed for declaration of TDescriptor
  9. //
  10. #include "MoreAEM.h"
  11.  
  12. //
  13. // Iteration direction
  14. //
  15. enum
  16. {
  17.     kForwardIteration = 0,
  18.     kBackwardIteration
  19. };
  20.  
  21. class TAbstractScriptableObject;
  22. class TAbstractCollector;
  23. class TAbstractSearchSpec;
  24. class TAETransaction;
  25.  
  26. //========================================================================================
  27. // Class TAbstractObjectIterator
  28. //========================================================================================
  29. class TAbstractObjectIterator
  30. {
  31. public:
  32.     virtual ~TAbstractObjectIterator();
  33.     
  34.     //
  35.     // Call Release to free an iterator; this way, subclasses of
  36.     // TAbstractObjectIterator may be reference-counted, if desired.
  37.     // It would be nice to make ~TAbstractObjectIterator protected
  38.     // to prevent clients from calling 'delete' directly, but
  39.     // that also prevents instantiation of stack-based iterators,
  40.     // which isn't good.
  41.     //
  42.     virtual void                        Release();
  43.     
  44.     //
  45.     // Interface to code to:
  46.     //
  47.     virtual void                        Reset(const TAETransaction& t, Boolean iterationDirection = kForwardIteration) = 0;
  48.     virtual Boolean                        More(const TAETransaction&) const = 0;
  49.     virtual void                        Next(const TAETransaction&) = 0;
  50.     virtual TAbstractScriptableObject*    Current(const TAETransaction&) = 0;
  51.     virtual void                        RemoveCurrent(const TAETransaction&);    // Default implementation fails
  52.  
  53.     //
  54.     // Need to rename this routine
  55.     //
  56.     virtual Boolean                        Contains(const TAETransaction& t, TAbstractScriptableObject* objectToTestForMembership);
  57.  
  58.     //
  59.     // Override these methods to improve performance:
  60.     //
  61.     virtual Boolean                        CurrentDerivedFromOSLClass(const TAETransaction& t, DescType objectClass);
  62.     virtual long                        CountElements(const TAETransaction& t, DescType desiredClass);
  63.     virtual TAbstractScriptableObject*    GetIndexedElement(const TAETransaction& t, DescType desiredClass, long index);
  64.     virtual TAbstractScriptableObject*    GetNamedElement(const TAETransaction& t, DescType desiredClass, TDescriptor nameDesc);
  65.     virtual void                        AccessBySearchSpec(const TAETransaction& t, TAbstractCollector* collector, DescType desiredClass, TAbstractSearchSpec* searchSpec);
  66.     virtual void                        SearchDeep(const TAETransaction& t, TAbstractCollector* collector, DescType desiredClass, TAbstractSearchSpec* searchSpec);
  67.     void                                RecursiveSearchDeep(const TAETransaction& t, TAbstractCollector* collector, DescType desiredClass, TAbstractSearchSpec* searchSpec);
  68. };
  69.  
  70. //========================================================================================
  71. // Class TSingleObjectIterator
  72. //========================================================================================
  73. class TSingleObjectIterator : public TAbstractObjectIterator
  74. {
  75. private:
  76.     TAbstractScriptableObject*            fObject;
  77.     TAbstractScriptableObject*            fCurrent;
  78.     
  79. public:
  80.     virtual ~TSingleObjectIterator();
  81.     TSingleObjectIterator(TAbstractScriptableObject* object) : fObject(object), fCurrent(object) {}
  82.     
  83.     //
  84.     // Interface to code to:
  85.     //
  86.     virtual void                        Reset(const TAETransaction& t, Boolean iterationDirection = kForwardIteration);
  87.     virtual Boolean                        More(const TAETransaction&) const;
  88.     virtual void                        Next(const TAETransaction&);
  89.     virtual TAbstractScriptableObject*    Current(const TAETransaction&);
  90.  
  91.     //
  92.     // Performance enhancement:
  93.     //
  94.     virtual long                        CountElements(const TAETransaction& t, DescType desiredClass);
  95.     virtual TAbstractScriptableObject*    GetIndexedElement(const TAETransaction& t, DescType desiredClass, long index);
  96. };
  97.  
  98. //========================================================================================
  99. // CLASS TCollectionIterator
  100. //========================================================================================
  101.  
  102. class TCollectionIterator : public TAbstractObjectIterator
  103. {
  104. private:
  105.     TAbstractObjectIterator**            fIterCollection;
  106.     long                                fItersInCollection;
  107.     long                                fCollectionSize;
  108.     long                                fCurrentIter;
  109.     Boolean                                fDirection;
  110.     
  111. public:
  112.     virtual ~TCollectionIterator();
  113.     TCollectionIterator() :
  114.         fIterCollection(nil),
  115.         fItersInCollection(0),
  116.         fCollectionSize(0),
  117.         fCurrentIter(0),
  118.         fDirection(kForwardIteration) {}
  119.  
  120.     void                                AddIterator(TAbstractObjectIterator* iter);
  121.     void                                AddObject(const TAETransaction& t, TAbstractScriptableObject* object);
  122.     void                                AddElementsOfObject(const TAETransaction& t, TAbstractScriptableObject* object);
  123.     TAbstractObjectIterator*            CurrentIterator() const;
  124.  
  125.     //
  126.     // Interface to code to:
  127.     //
  128.     virtual void                        Reset(const TAETransaction& t, Boolean iterationDirection = kForwardIteration);
  129.     virtual Boolean                        More(const TAETransaction&) const;
  130.     virtual void                        Next(const TAETransaction&);
  131.     virtual TAbstractScriptableObject*    Current(const TAETransaction&);
  132.  
  133.     //
  134.     // Performance enhancement:
  135.     //
  136.     virtual Boolean                        CurrentDerivedFromOSLClass(const TAETransaction& t, DescType objectClass);
  137.     virtual void                        SearchDeep(const TAETransaction& t, TAbstractCollector* collector, DescType desiredClass, TAbstractSearchSpec* searchSpec);
  138. };
  139.  
  140. #endif
  141.